home *** CD-ROM | disk | FTP | other *** search
/ Chip 1996 April / CHIP 1996 aprilis (CD06).zip / CHIP_CD06.ISO / hypertxt.arj / 9509 / TCL.CD < prev    next >
Text File  |  1996-03-10  |  17KB  |  345 lines

  1.           @VX  Window   grafikus  alkalmazások   fejlesztése  Tcl/Tk
  2.           @Vnyelven@N
  3.  
  4.           @VTcl-ben egyszerûbb!@N
  5.  
  6.               X Window alá  alapvetôen C nyelven  írhatunk programokat
  7.           --  de  ez  egyáltalán  nem  egyszerû.  Egyszerûbb programok
  8.           fejlesztéséhez találták ki a Tcl/Tk nyelvet, amit akár az  X
  9.           Window Basicjének is nevezhetünk.
  10.               Az   alábbiakban   meg  szeretnénk   mutatni   a  Tcl/Tk
  11.           alkalmazások fejlesztésének  alapjait, és  kedvet szeretnénk
  12.           csinálni további programokhoz néhány ötletes példaalkalmazás
  13.           bemutatásával. Az alább leírtak feltételezik, hogy a  Tcl/Tk
  14.           csomag már feltelepült a Unix rendszerünk alá, és van egy  X
  15.           Window alkalmazások megjelenítésére képes terminálunk.
  16.               A rendszer kitalálói  elôször egy általános  célú script
  17.           nyelv alapjait teremtették meg, amit Tcl-nek, ""tool command
  18.           languange"-nek  neveztek   el.  A   késôbbiek  során   ehhez
  19.           készítettek    kiterjesztéseket,    például    a    grafikus
  20.           kezelôfelületek  létrehozására  alkalmas  Tk  kiterjesztést,
  21.           amely egy toolkit az X Window rendszerhez.
  22.  
  23.  
  24.           @VIsmerkedés@N
  25.  
  26.               A   Tclben   írt    alkalmazásokat   egy   @Ktclsh@N    nevû
  27.           scriptértelmezô shellel  tudjuk lefuttatni.  Ha interaktívan
  28.           szeretnénk  kipróbálni  a Tcl  lehetôségeit,  indítsuk el  a
  29.           tclsh  programot  paraméter nélkül.  A  kapott promptba  Tcl
  30.           parancsokat gépelhetünk.  Indulásként írjuk  be a  következô
  31.           parancsot:
  32.               @Kexpr 4 + 4@N
  33.               A  parancs  hatására  a  tclsh  kiértékeli  a   megadott
  34.           kifejezést,  kiírja  a  végeredményt,  és  kiad  egy   újabb
  35.           promptot  a  következô  parancs  számára.  E  példából sokat
  36.           megtanulhatunk  a  Tcl  parancsok  felépítésérôl.  A parancs
  37.           részeit  szóköz  karakterek  választják el.  Az  elsô  szó a
  38.           parancs, utána  felsoroljuk a  hozzá tartozó  paramétereket.
  39.           Persze ennél bonyolultabb  mûveleteket is végezhetünk  a Tcl
  40.           segítségével. Gépeljük be a következô parancsot:
  41.               @Kexpr (3 > 4 ) || ( 6 <= 7 )@N
  42.               Ez egy logikai kifejezés,  a *Y**Y* jel az  OR mûveletet
  43.           jelöli. A kifejezés eredménye egy logikai érték.
  44.               A tclsh-ból az exit paranccsal léphetünk ki.
  45.  
  46.  
  47.           @VVáltozók, eljárások@N
  48.  
  49.               A Tclben képesek  vagyunk különbözô adatokat  változókba
  50.           írni és ezeket kifejezésekbe behelyettesíteni. A változóknak
  51.           a set paranccsal tudunk értéket adni:
  52.               @Kset a 44@N
  53.               Egy változóra $változónév módon hivatkozhatunk:
  54.               @Kexpr $a * 4@N
  55.               A Tcl rendelkezik egy alap eljáráskészlettel, amit saját
  56.           eljárásokkal bôvíthetünk.
  57.               Az 1.  példa eljárása  egy hatványozást  végzô függvényt
  58.           valósít meg. Láthatjuk, hogy a @Kproc@N utasítás elsô paramétere
  59.           az   újonnan  definiált   utasítás  neve,   ezt  követik   a
  60.           paraméterei  kapcsos  zárójelbe  zárva,  majd  egy következô
  61.           kapcsos  zárójelben  a  végrehajtandó  utasítások.  A @Kreturn
  62.           $változó@N  utasítással  adhatunk  vissza  értéket  a függvény
  63.           visszatérésekor.
  64.               A Tcl nyelvben is  vannak globális és lokális  változók.
  65.           Egy  függvényen  belül definiált  változó  lokális az  adott
  66.           függvényre  nézve,  és  globális  a  beágyazott függvényekre
  67.           nézve.
  68.  
  69.  
  70.           @VSpecialitások@N
  71.  
  72.               A Tcl sokban eltér más programozási nyelvektôl.  Például
  73.           a C programozási nyelvben fenntartott szavak vannak,  melyek
  74.           az  utasítások teljes  szintaxisát és  belsô felépítését  is
  75.           definiálják. A  Tclben nincs  rögzített nyelvtan,  hanem egy
  76.           scriptértelmezô fut végig a Tcl utasításokon és eljárásokon.
  77.           Az értelmezô mûködése és szabályai rögzítettek, de  bármikor
  78.           definiálhatunk új utasításokat, vagy  ""felüldefiniálhatjuk"
  79.           a régieket.
  80.               A    ciklusokat,     eljárásokat    és     kifejezéseket
  81.           utasításokként  implementálhatjuk,  a  Tcl  alapvetôen   nem
  82.           kezeli ezeket  a struktúrákat.  Nézzük meg  például az elôzô
  83.           példában a ciklus kialakítását!
  84.  
  85.  
  86.           @VA Tk nyelv alapvetô használata@N
  87.  
  88.               Bár a  Tcl tartalmaz  egy széles  körû utasításcsomagot,
  89.           nem   önálló   felhasználásra   fejlesztették,   hanem   más
  90.           alkalmazásspecifikus     kiegészítô      utasításcsomagokkal
  91.           támogatott   programok    fejlesztésére.   Ezek    közül   a
  92.           legérdekesebb talán a Tk csomag, amely egy X Window toolkit,
  93.           Tcl utasítások formájában megírva.
  94.               Azt a  programot, amely  a Tk  kiegészítést használó Tcl
  95.           alkalmazásokat  is  futtatni  tudja,  @Kwish@N-nek  hívják.   Ha
  96.           interaktívan szeretnénk játszani a Tk kiegészítéssel,  adjuk
  97.           ki a  @Kwish@N parancsot  paraméter nélkül!  Ennek hatására  már
  98.           nemcsak egy Tcl promptot kapunk, hanem egy grafikus ablak is
  99.           nyílik,  amiben az  általunk késôbb  megadott elemek  fognak
  100.           megjelenni. Elsô  lépésként gépeljük  be 2.  példaprogramot,
  101.           eredményeként ezt láthatjuk:
  102.  
  103.           @<9509\HELLOWO.GIF>■■@N  1. ábra
  104.  
  105.               Több  dolog is  magyarázatra szorul  ebben a  scriptben.
  106.           Elôször is a @Kbutton@N és  a @Kpack@N utasítás. Mindkettô a  Tk-ban
  107.           van implementálva. Az  utasítások felépítése és  értelmezése
  108.           pontosan az  elôzô fejezetben  leírt Tcl  értelmezés szerint
  109.           mûködik itt is.
  110.               A Tk  utasítások megértéséhez  meg kell  ismerkedni az X
  111.           Window rendszer és az X Window alkalmazások felépítésével.
  112.               A grafikus  kezelôfelület alapegysége  a @Kwidget@N  (window
  113.           gadget, azaz ablak-szerkentyû). A widget egy ablak, amelynek
  114.           definiált  megjelenése  és  viselkedése  van.  A  widgeteket
  115.           osztályokra  oszthatjuk: például  button (nyomógomb),  menu,
  116.           scrollbar (görgetôsáv). Az azonos osztályba tartozó widgetek
  117.           megjelenése  és  viselkedése azonos.  Például  minden button
  118.           widget megjelenít egy  szöveget vagy bitmapet,  és végrehajt
  119.           egy utasítást, ha rákattintottak az egérrel.
  120.               Az egy alkalmazáson belüli widgetek egy hierarchikus  fa
  121.           struktúrába  vannak  szervezve.  Az  alkalmazás  fô  ablakát
  122.           ""."-nak hívják. Az összes ezen belül megjelenô ablak  ennek
  123.           az  ablaknak a  gyereke. Az  egyes widgeteket  a  fôablakból
  124.           származtatva, az összes szülôt megadva határozhatjuk meg.  A
  125.           szülôket ponttal választjuk el egymástól. A fenti példában a
  126.           .gomb widget  a fôablakból  leszármazott gomb  nevû widgetet
  127.           jelöli. A @K.a.b.c@N widget a fô ablakban lévô @Ka@N-ból származó  @Kb@N
  128.           widget @Kc@N nevû gyereke.
  129.               Minden widget  létrehozásához tartozik  egy utasítás  és
  130.           ennek   paraméterei,   amelyek   a   widget  konfigurációját
  131.           határozzák meg. Ezen opciók  közül nem kell mindet  megadni,
  132.           nagy részüknél használhatjuk az alapbeállításokat. A  @Kbutton@N
  133.           utasítás erre példa: megadtuk vele, milyen osztályba  sorolt
  134.           widgetet szeretnénk létrehozni, és a paraméterekkel az adott
  135.           widget  konfigurációját  állítottuk  be.  A  @Kpack@N   utasítás
  136.           hatására  a  widget  megjelenik  a  képernyôn  (a  widget  a
  137.           létrehozásakor még nem jelenik meg).
  138.               A megjelenítéssel kapcsolatos az entitások egy független
  139.           csoportja:  a  geometriai  vezérlôk.  A  geometriai vezérlôk
  140.           jelenítik meg, helyezik el és méretezik a widgeteket. A pack
  141.           utasítás  például  egy  ilyen  geometriai  vezérlônek   küld
  142.           parancsot a widget megjelenítésére.
  143.  
  144.  
  145.           @VEsemények@N
  146.  
  147.               Az egyes widgetekkel kapcsolatos eseményekhez  általában
  148.           utasításokat rendelhetünk. Ilyen esemény lehet az egér adott
  149.           gombjának lenyomása  vagy felengedése,  valamelyik billentyû
  150.           lenyomása vagy elengedése.
  151.               A  3.  példa  az  elôbbi  hatványozási  feladat grafikus
  152.           kezelôfelületének megvalósítása:
  153.  
  154.           @<9509\POWER.GIF>■■@N  2. ábra
  155.  
  156.               Ebben  az alkalmazásban  5 widgetet  hozunk létre,  ezek
  157.           közül kettô szolgál az adatok bevitelére @K(entry)@N, kettô  fix
  158.           szöveget jelez  ki, és  egy jelzi  az eredményt  dinamikusan
  159.           @K(label)@N. A két beviteli mezôben a [Return] gomb  lenyomására
  160.           végrehajtódik a megfelelô bind után megadott utasítás.
  161.  
  162.  
  163.           @VTovábbi példák@N
  164.  
  165.               A  fenti  egyszerû  példák  során  megismerkedhettünk  a
  166.           @Kbutton@N és  a @Klabel@N  widgettel. A  Tk-ban persze  ennél jóval
  167.           több elôredefininált  widget van,  néhányuk felhasználásával
  168.           szeretném  bemutatni  e  programozási  eszköz  elônyeit   és
  169.           tulajdonságait.
  170.               A  4.  program  egy  menüsor  és  a  görgetôsávos listák
  171.           kezelését hivatott bemutatni. A program egy listát tölt  fel
  172.           az aktuális alkönyvtárbeli file-ok neveivel.
  173.  
  174.           @<9509\LISTA.GIF>■■@N  3. ábra
  175.  
  176.               A menüsort  a @Kframe@N  utasítással hozzuk  létre. A  @Kframe@N
  177.           gyermekeiként hozzuk  létre a  menü elemeit,  így azon belül
  178.           fognak elhelyezkedni. Az  eseményeket csak késôbb  rendeljük
  179.           hozzájuk, most  csak a  paramétereket állítjuk  be. A listát
  180.           egy  @Klistbox@N  és egy  @Kscrollbar@N  widget segítségével  hozzuk
  181.           létre. Ezeket a fentiek szerint kell egymáshoz rendelnünk, a
  182.           megfelelô  mûködés  érdekében.  A  file-listázó  menüponthoz
  183.           négysoros Tcl  scriptet, míg  a @KQuit@N  gombhoz egyszerû  @Kexit@N
  184.           utasítást rendeltünk.  Végül a  már ismert  @Kpack@N utasítással
  185.           megjelenítjük  a létrehozott  widgeteket. A  példaprogramból
  186.           megismerhetjük   a  @Kpack@N   utasítás  néhány   specialitását,
  187.           melyekkel különbözô irányokba rendezhetjük a widgetet,  vagy
  188.           megadhatjuk, milyen irányban töltsék ki az ablakot.
  189.               Az 5. példaprogramban a grafikus alkalmazások egy  másik
  190.           gyakran elôforduló elemét, a radiobuttont (kiválasztógombot)
  191.           mutatom be:
  192.  
  193.           @<9509\SETFONT.GIF>■■@N  4. ábra
  194.  
  195.               Az  ablakban megjelenô  gombok közül  mindig csak  egyet
  196.           választhatunk ki,  és ez  adott esetben  egy font-típust  ad
  197.           vissza.  A  legfelsô  sorban  egy  minta  szöveg  található,
  198.           amelyre a jobb gombbal kattintva a betûk típusát állíthatjuk
  199.           be, a bal gombra pedig kilépünk a programból.
  200.  
  201.  
  202.           @VBeszerzés, szakirodalom@N
  203.  
  204.               A teljes Tcl és Tk csomagot az @Kftp.cs.berkeley.edu@N  nevû
  205.           anonymous   ftp   szerverrôl  ftp-zhetjük   le.   A  Tcl   a
  206.           @K/ucb/tcl/tcl7.3.tar.Z@N file-ban, a Tk a  @K/ucb/tcl/tk3.6.tar.Z@N
  207.           file-ban található. Ugyanebben az alkönyvtárban  találhatunk
  208.           példaprogramokat  és  a   készülô  új  programverziók   béta
  209.           példányait.  A  Linux  aktuális  Slackware  csomagjában   is
  210.           megtalálható a többé-kevésbé legfrissebb verzió.
  211.               A Tcl és a  Tk nyelv mélyebb megismeréséhez  a fejlesztô
  212.           által írt könyvet ajánlom:  @KJohn K. Ousterhout: Tcl  and the
  213.           TK Toolkit. Addison-Wesley Publishing Company, 1994.@N
  214.  
  215.  
  216.           @VKiegészítések a Tcl és Tk nyelvhez@N
  217.  
  218.               Az @Kexpect@N az egyik legrégebbi Tcl alkalmazás, de  egyben
  219.           a  legközkedveltebb   is.  A   program  képes   interaktívan
  220.           beszélgetni  más  programokkal. Olyan  scriptet  lehet írni,
  221.           amely  megadott  bemenetre  vár,  és  ha  megkapta, válaszol
  222.           valamit vagy meghív  egy másik programot.  Ilyen szekvenciát
  223.           tetszôleges hosszan definiálhatunk.
  224.               Az @KExtended Tcl@N (TclX) bôvítései:
  225.               @V*@N újabb Posix rendszerhívások és függvények érhetôk el
  226.               @V*@N az  @Kawk@N program  funkciójához hasonló  file-feldolgozó
  227.           lehetôségek
  228.               @V*@N kulcsos listák, C struktúrákhoz hasonló lehetôségek
  229.               @V*@N idô- és dátum-manipuláló és -konvertáló programok
  230.               @V*@N on-line súgó
  231.               @V*@N debugger és programfejlesztési környezet.
  232.               Az  @KXF@N   nagyban  megkönnyíti   a  Tcl/Tk   alkalmazások
  233.           fejlesztését,  azzal  hogy  grafikus  felületet  biztosít  a
  234.           kezelôfelületünk    kialakításához,    azaz    a    widgetek
  235.           elkészítéséhez  és  paraméterezéséhez.  Érdekessége,  hogy a
  236.           fejlesztés alatt álló Tcl/Tk alkalmazás egyfolytában él, így
  237.           az  összes  változtatás azonnal  megjelenik  a képernyônkön.
  238.           Tartalmazza    a   szükséges    menüpontokat   az    ablakok
  239.           létrehozására, és késôbbi átkonfigurálására. Lehetôséget  ad
  240.           az  esemény-hozzárendelések  egyszerû  beállítására.  Az  XF
  241.           tartalmazza az összes eredeti widget osztályt és lehetôséget
  242.           ad  újak  definiálására.  Támogatja  a  legtöbb  Tcl  és  Tk
  243.           kiegészítést, maga az XF is egy Tcl/Tk alkalmazás.
  244.               A   @KTcl-DP@N   lehetôséget   ad   elosztott   alkalmazások
  245.           fejlesztésére.  Legfontosabb  szolgáltatása  az  RPC (remote
  246.           procedure  call)  támogatás.  Egy  alkalmazást  több  részre
  247.           bontva  futtathatunk   vele  különbözô   gépeken,  és   ezek
  248.           hálózaton kommunikálhatnak egymással.
  249.               Az  @KAk@N audio  kiterjesztés a  Tclhez. A  kiegészítés  az
  250.           AudioFile  nevû  szabványra  épül,  amely  hálózatfüggetlen,
  251.           hangkártya-független audio  rendszer, s  több platformon  is
  252.           rendelkezésre  áll.  Az  @KAk@Nval  ki  tudunk  adni  olyan  Tcl
  253.           utasításokat,    amelyek    audio    file   visszajátszását,
  254.           felvételét, telefonvezérlést és szinkronizációt  valósítanak
  255.           meg.
  256.  
  257.           @KSára Endre (endre@@carenet.hu)@N
  258.  
  259.  
  260.           @V1. példa: egy egyszerû eljárás@N
  261.  
  262. proc power {base p} {
  263.    set result 1
  264.    while ($p > 0) {
  265.       set result [expr $result * $base]
  266.       set p [exprt $p-1]
  267.    }
  268.    return $result
  269. }
  270.  
  271.  
  272.           @V2. példa: szöveg az ablakban
  273.  
  274. button .gomb -text "Hello, world!" -command exit
  275. pack .gomb
  276.  
  277.  
  278.           @V3. példa: interaktív hatványozó rutin
  279.  
  280. #!/opt/bin/wish -f
  281. proc power {base p} {
  282.    set result 1
  283.    while {$p>0} {
  284.       set result [expr $result*$base]
  285.       set p [expr $p-1]
  286.    }
  287.    return $result
  288. }
  289. entry .base -width 6 -relief sunken -textvariable base
  290. label .label1 -text "to the power"
  291. entry .power -width 6 -relief sunken -textvariable power
  292. label .label2 -text "is"
  293. label .result -textvariable result
  294. pack .base .label1 .power .label2 .result -side left -padx 1m -pady 2m
  295. bind .base <Return> {set result [power $base $power]}
  296. bind .power <Return> {set result [power $base $power]}
  297.  
  298.  
  299.           @V4. példa: menükezelés
  300.  
  301. #!/opt/bin/wish -f
  302. frame .mbar -relief raised -bd 2
  303. menubutton .mbar.ls -text "List files" -underline 0
  304. menubutton .mbar.quit -text "Quit" -underline 0
  305. listbox .e -relief raised -borderwidth 2 -yscrollcommand ".scroll set"
  306. scrollbar .scroll -command ".e yview"
  307. bind .mbar.ls <1> {
  308.    set result [exec ls]
  309.    foreach i $result {
  310.       .e insert end $i
  311.       }
  312. }
  313. bind .mbar.quit <1> {exit}
  314. pack .mbar -fill x
  315. pack .mbar.ls -side left
  316. pack .mbar.quit -side right
  317. pack .e -side left
  318. pack .scroll -side right -fill y
  319.  
  320.  
  321.           @V5. példa: kiválasztógombok
  322.  
  323. #!/opt/bin/wish -f
  324. set font times
  325. radiobutton .times -text Times -variable font -value times -anchor w
  326. radiobutton .courier -text Courier -variable font -value courier -anchor w
  327. radiobutton .helvetica -text Helvetica -variable font -value helvetica -anchor w
  328. radiobutton .symbol -text Symbol -variable font -value symbol -anchor w
  329. bind .title <3> {.title configure -font *-$font-*}
  330. pack .title .times .courier .helvetica .symbol -side top -fill x
  331.  
  332.  
  333.           @VEsemények
  334.  
  335.           Néhány  példa  olyan   lehetséges  eseményekre,   amelyekhez
  336.           valószínûleg utasításokat kapcsolhatunk:
  337.  
  338. <Button-1>         A bal egérgomb lenyomása
  339. <ButtonRelease-1>  A bal egérgomb elengedése
  340. <DoubleButton-1>   A bal egérgomb dupla lenyomása
  341. <Key-a>            Az ""a" betû leütése
  342. <Motion>           Egérkurzor mozgatás a widget felett
  343. <B1-Motion>        Az egérkurzor mozgatása a bal gomb nyomvatartásával
  344. <Any-Motion>       Az egérkurzor mozgatása egy tetszôleges gomb nyomvatartásával
  345.